###########上传图片代码#################

# from fdfs_client.client import Fdfs_client
#
#
# # 1.创建客户端
# client = Fdfs_client('utils/fastdfs/client.conf')
#
# # 2.上传图片
# client.upload_by_filename('/home/ubuntu/Desktop/PictureCtM3BVni0w6AUaJbAAAmv27pX4k0365964.jpeg')

from django.shortcuts import render
from django.views import View
from utils.goods import get_categories
from apps.contents.models import ContentCategory

class IndexView(View):

    def get(self,request):
        # 首页数据分为２部分

        # １部分是商品分类数据
        categories = get_categories()

        # ２部分是广告数据
        contents = {}
        content_categories = ContentCategory.objects.all()
        for cat in content_categories:
            contents[cat.key] = cat.content_set.filter(status=True).order_by('sequence')

        # 渲染模板的上下文
        context = {
            'categories': categories,
            'contents': contents,
        }
        return render(request, 'index.html', context)



################商品列表页面######################
'''
需求：　根据点击的分类，来获取分类数据（有排序，有分页）

前端：　前端会发送一个axios请求，分类id在路由中，分页的页码（第几页数据），每页多少条数据，排序也会传递过来

后端：

    请求：　接收参数
    
    业务逻辑：　根据需求查询数据，将对象数据转换为字典数据
    
    响应：　JSON
    
    路由：　GET /list/category_id/skus/
    
    步骤：
    
        １．接收参数
        ２．获取分类id
        ３．根据分类id进行分类数据的查询验证
        ４．获取面包屑数据
        ５．查询分类对应的SKU数据，然后排序，然后分页
        ６．返回响应

'''

from django.http import JsonResponse
from apps.goods.models import GoodsCategory
from utils.goods import get_breadcrumb
from apps.goods.models import SKU
from django.core.paginator import Paginator

class ListView(View):

    def get(self,request,category_id):

        # １．接收参数

        # 排序字段
        ordering = request.GET.get('ordering')

        # 每页多少条数据
        page_size = request.GET.get('page_size')

        # 要第几页数据
        page = request.GET.get('page')
        # ２．获取分类id
        # ３．根据分类id进行分类数据的查询验证

        try:
            category = GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist:
            return JsonResponse({'code':400,'errmsg':'参数缺失'})

        # ４．获取面包屑数据

        breadcrumb = get_breadcrumb(category)

        # ５．查询分类对应的SKU数据，然后排序，然后分页

        # 排序
        skus = SKU.objects.filter(category=category,is_launched=True).order_by(ordering)

        # 分页
        paginator = Paginator(skus, per_page=page_size)

        # 获取指定页码数据
        page_skus = paginator.page(page)

        sku_list = []
        for sku in page_skus.object_list:
            sku_list.append({
                'id':sku.id,
                'name':sku.name,
                'price':sku.price,
                'default_image_url':sku.default_image.url
            })

        # 获取总页码
        total_num = paginator.num_pages

        # ６．返回响应

        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'list':sku_list,
            'breadcrumb': breadcrumb,
            'count': total_num
        })





####################列表页商品热销排行#############################


class HotGoodsView(View):
    """商品热销排行"""

    def get(self, request, category_id):
        """提供商品热销排行JSON数据"""
        # 根据销量倒序
        skus = SKU.objects.filter(category_id=category_id, is_launched=True).order_by('-sales')[:2]

        # 序列化
        hot_skus = []
        for sku in skus:
            hot_skus.append({
                'id':sku.id,
                'default_image_url':sku.default_image.url,
                'name':sku.name,
                'price':sku.price
            })

        return JsonResponse({'code':0, 'errmsg':'OK', 'hot_skus':hot_skus})





from haystack.views import SearchView

class SKUSearchView(SearchView):

    def create_response(self):
        context = self.get_context()
        sku_list = []
        for sku in context['page'].object_list:
            sku_list.append({
                'id': sku.object.id,
                'name': sku.object.name,
                'price': sku.object.price,
                'default_image_url': sku.object.default_image.url,
                'searchkey': context.get('query'),
                'page_size': context['page'].paginator.num_pages,
                'count': context['page'].paginator.count
            })



        return JsonResponse(sku_list,safe=False)




##############商品详情页面##################
'''
需求　详情页面

１．分类数据
２．面包屑
３．SKU信息
４．规格信息

'''

from utils.goods import get_categories
from utils.goods import get_breadcrumb
from utils.goods import get_goods_specs

class DetailView(View):

    def get(self,request,sku_id):
        try:
            sku = SKU.objects.get(id=sku_id)
        except SKU.DoesNotExist:
            pass
        # １．分类数据
        categories = get_categories()

        # ２．面包屑
        breadcrumb = get_breadcrumb(sku.category)
        # ３．SKU信息
        # ４．规格信息
        goods_specs = get_goods_specs(sku)

        context = {
            'categories': categories,
            'breadcrumb': breadcrumb,
            'sku': sku,
            'specs': goods_specs
        }

        return render(request, 'detail.html', context)




################统计分类商品数据#########################
'''
统计分类商品访问量 是统计一天内该类别的商品被访问的次数。
需要统计的数据，包括商品分类，访问次数，访问时间。
一天内，一种类别，统计一条记录。

需求：　统计点击信息，统计每一天的分类商品访问量

前端：　当访问具体页面的时候，会发送一个axios请求，携带分类id

后端：

    请求：　接收请求，获取参数
    业务逻辑：　查询有没有，有的话更新数据，没有的话新建数据
    响应：　POST detail/visit/<category_id>/
    
    步骤：
    １．接受分类id
    ２．验证参数（验证分类id）
    ３．查询当天这个分类的记录有没有
    ４．没有的话新建数据
    ５．有的话更新数据
    ６．返回响应
'''

class GoodsVisitCountView(View):
    
    def post(self,request,category_id):

        # １．接受分类id
        # ２．验证参数（验证分类id）
        try:
            category=GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist:
            return JsonResponse({'code':400, 'errmsg':'没有此分类'})

        # ３．查询当天这个分类的记录有没有
        from datetime import date
        from apps.goods.models import GoodsVisitCount

        today=date.today()
        try:
            gvc = GoodsVisitCount.objects.get(category=category,date=today)
        except GoodsVisitCount.DoesNotExist:
        # ４．没有的话新建数据
            GoodsVisitCount.objects.create(category=category,
                                           date=today,
                                           count=1)
        else:
        # ５．有的话更新数据
            gvc.count+=1
            gvc.save()

        # ６．返回响应
        return JsonResponse({'code':0,'errmsg':'ok'})